package cn.pengyinrui.department.system.verifycode.controller;

import cn.pengyinrui.department.constants.BaseConstants;
import cn.pengyinrui.department.system.verifycode.domian.EamilVcode;
import cn.pengyinrui.department.system.verifycode.domian.Vcode;
import cn.pengyinrui.department.utils.*;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.web.bind.annotation.*;

import javax.validation.constraints.Email;
import java.io.IOException;
import java.util.concurrent.TimeUnit;

@RestController
@RequestMapping("/vcode")
@Api(value = "验证码的的API",description = "验证码的功能")
public class VerifyCodeController {
    @Autowired
    private RedisTemplate redisTemplate;
    @Autowired
    private SendMsgUtils sendMsgUtils;
    @Autowired
    private EmailUtil emailUtil;


    @PostMapping("/sendMsg")
    @ApiOperation(value = "发送短信")
    public AjaxResult sendMsg(@RequestBody Vcode vcode){
        String phone = vcode.getPhone();
//        String imageCode = vcode.getImageCode();
//        String imageCodeKey = vcode.getImageCodeKey();
        // 1.非空判断
        if(phone == null || "".equals(phone.trim())){
            return AjaxResult.error().setTip("手机号不能为空！");
        }
//        if(imageCode == null || "".equals(imageCode.trim())){
//            return AjaxResult.error().setTip("验证码不能为空！");
//        }
//        if(imageCodeKey == null || "".equals(imageCodeKey.trim())){
//            return AjaxResult.error().setTip("非法访问！");
//        }
        // 2.判断验证码是否匹配
//        Object o = redisTemplate.opsForValue().get(imageCodeKey);
//        if(o == null){// 如果为值为空，说明图形验证码过期
//            return AjaxResult.error().setTip("图形验证码已过期！");
//        }else if(!imageCode.equals(o.toString())){
//            return AjaxResult.error().setTip("图形验证码错误，请重新输入！");
//        }
        // 3.手机号验证

        // 4.生成短信验证码
        String sendCode = StrUtils.getRandomString(4);

        // 5.防止重发
        /**
         * 5.1设置验证码的key
         * 5.2设置短信发送时间的key
         * 5.3获取上一次发送验证码的时间
         */
        String codeKey = phone + BaseConstants.Vcode.REGISTER;// 短信验证码的key
        String timeKey = phone + BaseConstants.Vcode.REGISTER_TIME;// 发送短信的时间
        Long lastTime = (Long) redisTemplate.opsForValue().get(timeKey);// 上一次发送短信的时间
        /**
         * 判断，如果上一次没有发送短信
         * 5.4将短信验证码放入redis
         * 5.5获取到当前时间，设置为下一次请求时获取的上一次发送短信的时间
         */
        if(lastTime == null){
            redisTemplate.opsForValue().set(codeKey,sendCode,BaseConstants.Vcode.MESSAGE_OUT_TIME,TimeUnit.MINUTES);
            long statrTime = System.currentTimeMillis();// 首次发送短信的时间
            redisTemplate.opsForValue().set(timeKey,statrTime,BaseConstants.Vcode.MESSAGE_OUT_TIME,TimeUnit.MINUTES);// 将短信发送时间的key放入redis
        /**
         * 5.6如果上一次发送了短信，获取当前请求的时间，并计算两次的间隔
         * 5.7判断是否经过了60秒，如果没经过，提示请求错误
         */
        }else{
            //redisTemplate.opsForValue().set(timeKey,lastTime);
            long currentTime = System.currentTimeMillis();// 当前请求的时间
            if(currentTime-lastTime < 60000){
                return AjaxResult.error().setTip("请勿重复获取验证码！");
        /**
         * 5.8如果经过了六十秒，获取短信验证码
         * 5.9将上一次获取短信验证码的时间初始化，并放入redis
         * 5.10如果短信验证码存在的时间已过期，重新生成的短信验证码
         */
            }else{
                sendCode = (String) redisTemplate.opsForValue().get(codeKey);// 获取短信验证码
                redisTemplate.opsForValue().set(timeKey,currentTime,BaseConstants.Vcode.MESSAGE_OUT_TIME,TimeUnit.MINUTES);// 将首次发送短信时间初始化
                if(sendCode == null){
                    sendCode = StrUtils.getRandomString(4);
                    redisTemplate.opsForValue().set(codeKey,sendCode,BaseConstants.Vcode.MESSAGE_OUT_TIME,TimeUnit.MINUTES);
                }
            }
        }
        //sendMsgUtils.sendMsg(phone,sendCode);// 发送短信
        System.out.println(sendCode);
        return AjaxResult.success();
    }


    @PostMapping("/sendEmail")
    @ApiOperation(value = "发送邮件验证码")
    public AjaxResult sendEmail(@RequestBody EamilVcode email){
        // 生成邮箱验证码
        String emailCode = StrUtils.getRandomString(6);
        // 将邮箱验证码加入缓存
        String emailKey = email + BaseConstants.Vcode.REGISTER;
        redisTemplate.delete(emailKey);// 新发送邮件前清空之前缓存中保留的验证码
        redisTemplate.opsForValue().set(emailKey,emailCode);
        emailUtil.send(email.getEmail(),emailCode);
        return AjaxResult.success();
    }
}
